Generative Testing এর ধারণা এবং stest/check এর ব্যবহার

Computer Programming - ক্লোজার (Clojure) Spec এবং Generative Testing (Clojure Spec and Generative Testing) |
225
225

Generative Testing এর ধারণা

Generative Testing হল একটি ধরনের সফটওয়্যার টেস্টিং, যেখানে অটোমেটিক্যালি অপ্রত্যাশিত বা র‍্যান্ডম ইনপুট তৈরি করা হয় এবং সেগুলোর সাথে সফটওয়্যার পরীক্ষা করা হয়। এটি মূলত প্যারামেট্রিক টেস্টিংয়ের একটি পদ্ধতি, যেখানে কোনও নির্দিষ্ট ইনপুটের পরিবর্তে একটি সিস্টেম বা প্রোগ্রামকে বিভিন্ন ধরনের ইনপুটের সাথে পরীক্ষা করা হয়। এতে সফটওয়্যারটির সীমাবদ্ধতা, ভুল বা বাগ অল্প সময়ে সনাক্ত করা সম্ভব হয়।

Generative testing সাধারণত property-based testing এর সাথে সম্পর্কিত, যেখানে আপনি কিছু "properties" বা বৈশিষ্ট্য সংজ্ঞায়িত করেন এবং টেস্ট ফ্রেমওয়ার্কটি সেই বৈশিষ্ট্যগুলির উপর ভিত্তি করে র‍্যান্ডম ইনপুট তৈরি করে সেগুলি পরীক্ষণ করে।

Generative Testing এর মূল উপকারিতা:

  • বাগ বা ভুল শনাক্ত: অপ্রত্যাশিত ইনপুটের মাধ্যমে সফটওয়্যারের অজানা ত্রুটি শনাক্ত করা সহজ।
  • স্বয়ংক্রিয় ইনপুট উৎপাদন: ইনপুট তৈরি এবং ফলাফল যাচাইয়ের জন্য স্বয়ংক্রিয়ভাবে টেস্ট করা যায়।
  • স্কেলেবিলিটি: ইনপুট সীমানা এবং প্রকারের সংখ্যা সীমিত না থাকায় সফটওয়্যারটির বড় আয়তনে টেস্ট করা সম্ভব।

Clojure-এ Generative Testing এবং stest/check এর ব্যবহার

Clojure এ Generative Testing সাধারণত clojure.test.check লাইব্রেরি ব্যবহার করে করা হয়, যা property-based testing করতে সহায়ক। stest/check হল সেই ফাংশন যা আপনার টেস্ট পদ্ধতির মধ্যে randomized ইনপুট বা property পরীক্ষা করে।

clojure.test.check লাইব্রেরি ব্যবহার করে আপনি একটি property সংজ্ঞায়িত করেন এবং সেটি যেকোনো র‍্যান্ডম ইনপুটের উপর পরীক্ষা করতে পারেন। এটি ইনপুটের বৈধতা, সঠিকতা, বা পারফরম্যান্স পরীক্ষা করতে সহায়ক।


১. clojure.test.check লাইব্রেরি ইমপোর্ট করা

প্রথমে clojure.test.check লাইব্রেরিটি ইমপোর্ট করতে হবে:

(require '[clojure.test.check :as stest])
(require '[clojure.test.check.generators :as gen])
  • clojure.test.check.generators: বিভিন্ন ধরনের র‍্যান্ডম ডেটা তৈরি করার জন্য ব্যবহৃত হয়।
  • clojure.test.check: টেস্ট চালানোর জন্য ব্যবহৃত হয়।

২. Generative Testing এর উদাহরণ

উদাহরণ: দুটি সংখ্যা যোগফল পরীক্ষা

ধরা যাক, আমাদের একটি ফাংশন আছে যা দুটি সংখ্যার যোগফল ফেরত দেয়। আমরা এই ফাংশনের জন্য generative test করতে চাই।

(defn add [a b]
  (+ a b))

এখন আমরা একটি টেস্ট লিখবো যাতে এটি নিশ্চিত হয় যে, যোগফল সঠিকভাবে হচ্ছে। আমরা দুটি এলোমেলো (random) সংখ্যা তৈরি করবো এবং তাদের যোগফল পরীক্ষায় দিবো।

(defn add-property-test []
  (stest/quick-check 100  ;; মোট ১০০টি টেস্ট চালানো হবে
    (stest/for-all [a (gen/int) b (gen/int)]  ;; র‍্যান্ডম পূর্ণসংখ্যা ইনপুট তৈরি
      (= (+ a b) (add a b)))))

এখানে:

  1. quick-check: এটি আমাদের টেস্ট চালানোর ফাংশন। আমরা এর মাধ্যমে ১০০টি র‍্যান্ডম ইনপুটের জন্য টেস্ট চালাবো।
  2. gen/int: এটি এলোমেলোভাবে পূর্ণসংখ্যা তৈরি করে, যা ইনপুট হিসেবে ব্যবহৃত হবে।
  3. for-all: এটি ব্যবহার করে বিভিন্ন ইনপুট ডেটা সেটের জন্য টেস্ট চালানো হয়।

টেস্ট চালানো:

(stest/check add-property-test)

এটি টেস্ট চালাবে এবং যদি সব ইনপুট সঠিক হয়, তবে এটি পাস হবে। যদি কোনো ইনপুট ব্যর্থ হয়, তবে এটি ব্যর্থ টেস্টের বিস্তারিত তথ্য দেখাবে।


৩. Advanced Property-based Testing

Generative testing আরও জটিল পরীক্ষা করতে সক্ষম, যেমন:

  • সীমাবদ্ধতা পরীক্ষা: যেমন, সংখ্যা যদি একটি নির্দিষ্ট সীমার মধ্যে থাকে, বা কোন সংখ্যা মাইনাস না হয় ইত্যাদি।
  • কাস্টম জেনারেটর তৈরি করা: যখন আপনি কাস্টম ডেটা টেস্ট করতে চান, তখন আপনাকে কাস্টম generator তৈরি করতে হতে পারে।

উদাহরণ: কাস্টম জেনারেটর তৈরি করা

(defn even-gen []
  (gen/fmap #(* 2 %) (gen/int)))  ;; র‍্যান্ডম even সংখ্যার জন্য জেনারেটর

(defn even-add-property-test []
  (stest/quick-check 100
    (stest/for-all [a (even-gen) b (even-gen)]
      (even? (+ a b)))))  ;; টেস্ট: যে দুটি even সংখ্যা যোগ করা হচ্ছে, তাদের যোগফলও even হওয়া উচিত

এখানে, even-gen একটি কাস্টম জেনারেটর তৈরি করেছে যা শুধুমাত্র even সংখ্যাগুলি তৈরি করবে এবং টেস্টটি এটি পরীক্ষা করবে যে, দুটি even সংখ্যার যোগফলও even হবে।


৪. Transducers এর সাথে Generative Testing

clojure.test.check এর সাথে transducers ব্যবহারের মাধ্যমে আপনি আরও দক্ষ ডেটা প্রসেসিং করতে পারেন, বিশেষত যখন বড় পরিমাণের ডেটা পরীক্ষা করতে হয়।

(defn transduce-test []
  (stest/quick-check 100
    (stest/for-all [coll (gen/vector gen/int 10)]  ;; ১০টি এলোমেলো ইনপুট
      (= (transduce (map inc) + coll) (apply + (map inc coll))))))

এখানে, একটি vector তৈরি করা হয়েছে, এবং transduce ব্যবহার করে ইনপুটের প্রতিটি মানকে বৃদ্ধি (increment) করে তার যোগফল বের করা হয়েছে। টেস্টটি নিশ্চিত করবে যে, transduce এবং সাধারণ map/apply ব্যবহার করে একই ফলাফল পাবো।


সারসংক্ষেপ

Generative Testing বা Property-based Testing এমন একটি টেস্টিং পদ্ধতি যা র‍্যান্ডম বা অপ্রত্যাশিত ইনপুট ব্যবহার করে সফটওয়্যারের আচরণ পরীক্ষা করে। Clojure তে clojure.test.check লাইব্রেরি ব্যবহার করে আপনি সহজেই generative tests তৈরি করতে পারেন। এর মাধ্যমে আপনি কোনো নির্দিষ্ট ইনপুটের পরিবর্তে প্রোগ্রামের বৈশিষ্ট্য বা property পরীক্ষা করতে পারেন।

  • gen: এলোমেলো ডেটা তৈরি করার জন্য ব্যবহৃত হয়।
  • quick-check: টেস্ট চালানোর জন্য ব্যবহৃত হয়।
  • for-all: র‍্যান্ডম ইনপুটের জন্য পরীক্ষণ চালানো হয়।

Generative testing আপনার কোডের অজানা ত্রুটি শনাক্ত করতে সহায়ক এবং এটি আপনার সফটওয়্যারটির স্থিতিশীলতা ও নির্ভরযোগ্যতা বাড়াতে সাহায্য করবে।

common.content_added_by
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion